#include <stdio.h>
#include <stdlib.h>

struct ListNode
{
    int val;
    struct ListNode*next;
};


int solve(int n,int k,int m)
{
    // 搭建环形链表
    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* temp = dummy;
    
    // 记录开始遍历的节点
    // 由于要进行删除操作，因此进行前节点记录
    struct ListNode*start = (struct ListNode*)malloc(sizeof(struct ListNode)),
        *prev = (struct ListNode*)malloc(sizeof(struct ListNode));
    
    for (int i = 0; i < n;i++)
    {
        struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
        node->val = i;
        node->next = NULL;

        // 记录开始计数的节点
        if (i == k-1)
        {
            prev = node;
        }
        if (i == k)
        {
            start = node;
        }

        // 指针移动操作
        temp->next = node;
        temp = temp->next;
    }

    // 环形化
    temp->next = dummy->next;

    // 从第几个开始遍历？？？？
    int count = 1;
    // 只有一个节点时，prev节点要去干什么？？？
    while (start->next != start)
    {
        while (count < m)
        {
            // 移动一次记下一个数字
            prev = prev->next;
            start = start->next;
            count++;
        }

        // 执行删除操作
        struct ListNode*to_delete = start;
        start = start->next;        // start指针先进行后移
        prev->next = start;         // 然后让prev指针指向也进行后移
        free(to_delete);            // 无所谓，固定格式
        to_delete = NULL;   
        count = 1;                  // 不会死循环？？？
        /*链表不需要担心越界问题，并且比较直观，用数组硬做的都是大佬*/
    }

    // 最后输出链表的值
    printf("%d\n",start->val);
}

int main()
{
    int n,k,m;
    scanf("%d%d%d",&n,&k,&m);
    solve(n,k,m);
    return 0;
}